#include <stdio.h>

void char_print(char);
void num_print(long, void (*)(char));

int main(){

    long n = -1234567L;
    num_print(n, char_print);

    printf("\n%c", "124"[1]);

    return 0;
}

void char_print(char ch){
    printf("%c", ch);
}

void neg_num_print(long n, void (*p)(char)){
    if(n <= -10){
        neg_num_print(n / 10, p);
    }
    (*p)("0123456789"[-(n % 10)]);// 缺陷：%操作结果还可能可能是正数
}

void num_print(long n, void (*p)(char)){

    // if(n < 0){
    //     n = -n;// 缺陷：负数比正数多一个可表示的数，因此可能溢出
    //     (*p)('-');
    // }

    if(n >= 0){
        neg_num_print(-n, p);
    }else{
        (*p)('-');
        neg_num_print(n, p);
    }
    //(*p)(n % 10 + '0');// 缺陷：只有在0-9编码是连续的系统中可正常使用
    //(*p) ("0123456789"[n % 10]);
}